const { log } = require("async");
const { body, validationResult } = require("express-validator");
console.log(body,"body");

// 用户名与密码校验规则
const userValidationRules = () => [
  body("username")
    .notEmpty()
    .withMessage("用户名不能为空")
    .bail()
    .isLength({ max: 15 })
    .withMessage("用户名最多15个字符")
    .trim(),

  body("password")
    .notEmpty()
    .withMessage("密码不能为空")
    .bail()
    .isLength({ min: 6, max: 20 })
    .withMessage("密码长度需在6-20位之间")
    .matches(/[0-9]/)
    .withMessage("密码必须包含数字")
    .bail()
    .matches(/[a-zA-Z]/)
    .withMessage("密码必须包含字母"),
];

// 定义修改用户信息校验规则
const updateUserInfoRules = () => [
  body("id")
    .notEmpty().withMessage("id不能为空").bail()
    .isString().withMessage("id必须为字符串").bail(),
    
  body("nickname")
    .notEmpty().withMessage("昵称不能为空").bail()
    .isString().withMessage("昵称必须为字符串").bail()
    .isLength({ min: 2, max: 20 }).withMessage("昵称长度在2-20位之间"),
    
  body("email")
    .notEmpty().withMessage("邮箱不能为空").bail()
    .isEmail().withMessage("邮箱格式不正确").bail()
    .normalizeEmail()
];

// 定义重置密码规则 - 删除了重复的 const { body } = require('express-validator');
const updatePasswordRules = () => [
  body("oldPassword")
    .notEmpty().withMessage("旧密码不能为空").bail()
    .isLength({ min: 6, max: 20 }).withMessage("密码长度需在6-20位之间"),
    
  body("newPassword")
    .notEmpty().withMessage("新密码不能为空").bail()
    .isLength({ min: 6, max: 20 }).withMessage("新密码长度需在6-20位之间").bail()
    .matches(/[0-9]/).withMessage("新密码必须包含数字").bail()
    .matches(/[a-zA-Z]/).withMessage("新密码必须包含字母").bail()
    .custom((value, { req }) => {
      if (value === req.body.oldPassword) {
        throw new Error("新密码不能与旧密码相同");
      }
      return true;
    })
];

// 定义头像校验规则
const avatarValidationRules = () => [
  body("user_pic")
    .notEmpty().withMessage("头像不能为空").bail()
    .isString().withMessage("头像必须是字符串").bail()
    .custom((value) => {
      // 基础格式校验
      const base64Regex = /^data:image\/(\w+);base64,/i;
      if (!base64Regex.test(value)) {
        throw new Error("头像必须是有效的base64图片格式");
      }
      
      // 提取实际base64数据部分
      const base64Data = value.split(",")[1];
      
      // 验证base64数据有效性
      if (!base64Data || base64Data.trim() === "") {
        throw new Error("头像数据不能为空");
      }
      
      // 验证是否为有效的base64字符串
      const validBase64Regex = /^[A-Za-z0-9+/]+={0,2}$/;
      if (!validBase64Regex.test(base64Data)) {
        throw new Error("包含无效的base64字符");
      }
      
      // 验证图片类型
      const validTypes = ["jpeg", "png", "gif", "jpg", "webp"];
      const typeMatch = value.match(/image\/(\w+);/i);
      
      if (!typeMatch || !validTypes.includes(typeMatch[1].toLowerCase())) {
        throw new Error(`仅支持 ${validTypes.join(", ")} 格式的图片`);
      }
      
      // 验证图片大小 (不超过2MB)
      const maxSize = 2 * 1024 * 1024; // 2MB
      const sizeInBytes = Math.ceil(base64Data.length * 0.75); // base64实际大小计算
      
      if (sizeInBytes > maxSize) {
        throw new Error("头像大小不能超过2MB");
      }
      
      return true;
    })
];

// 错误处理中间件
const validate = (req, res, next) => {
  console.log(req.body,"req");
  const errors = validationResult(req);
  console.log(errors.isEmpty());
  if (errors.isEmpty()) {
    return next();
  }

  const firstError = errors.array()[0];

  // return res.status(400).json({
  //   status: 1,
  //   message: firstError.msg,
  // });
 return res.cc(firstError.msg)
};

module.exports = {
  userValidationRules,
  updateUserInfoRules,
  updatePasswordRules,
  avatarValidationRules,
  validate
};